﻿using System;
using System.Data;
using System.Data.Common;
using Vbyte.SharpOrm.SqlDb;

namespace Vbyte.SharpOrm.Adapter
{
    /// <summary>
    /// 相关数据库的特殊定义适配
    /// </summary>
    public interface ISqlDbAdapter
    {
        /// <summary>
        /// 获取针对NET CLR基本数据类型的Sql数据类型转换
        /// </summary>
        /// <param name="clrType">NET CLR基本基本类型</param>
        /// <param name="maxLength">可为空的最大长度限制</param>
        /// <returns></returns>
        string GetNativeType(Type clrType, int? maxLength);

        /// <summary>
        /// 获取指定表内最新产生标志的SQL语句获取文本
        /// </summary>
        /// <param name="currentTabName">当前表名，如果为null或空则返回全局标志。</param>
        /// <returns>标志的SQL语句获取文本</returns>
        string GetIdentitySql(string currentTabName);

        /// <summary>
        /// 标志该数据适配器是否有自己的数据分页实现
        /// </summary>
        /// <returns>实现则为true，否则为false。</returns>
        bool HasImplementCustomPage();


        /// <summary>
        /// 获取满足实例条件的分页数据
        /// </summary>
        /// <param name="dbInstance">数据库辅助实例</param>
        /// <param name="builderInstance">在实例样本上产生的SQL构建适配器</param>
        /// <param name="tabDef">获取实例表定义（备用:获取主键、max函数运算信息）</param>
        /// <param name="currentPage">当前数据页页次</param>
        /// <param name="pageSize">每页显示记录条数</param>
        /// <param name="sharedOpenConnection">当前存在的已打开连接的数据库连接</param>
        /// <param name="command">已生成的数据库操作命令实例</param>
        /// <returns>满足条件的内容数据表</returns>
        DataTable GetPagedDataTable(ISqlDb dbInstance, ISqlBuilderAdapter builderInstance, SqlTable tabDef,
            int currentPage, int pageSize, DbConnection sharedOpenConnection, DbCommand command);

    }
}
